package modelApp

import java.util.List
import model.Banco
import model.Biblioteca
import model.Club
import model.Embajada
import model.Lugar
import model.Pais
import org.uqbar.commons.model.ObservableUtils
import org.uqbar.commons.utils.Observable

abstract class EdicionAppModel {
	
	
	@Property Pais paisUM
	
	
	new (Pais pais) {
		 this.paisUM = pais
	}
	
}

@Observable
class EdicionLugarAppModel extends EdicionAppModel{
	
	@Property val lugaresPosibles = newArrayList => [
			add(new Biblioteca)
			add(new Club)
			add(new Banco)
			add(new Embajada)
		]
		
	@Property var Lugar addLugar
	@Property var Lugar delLugar
	
	new(Pais pais) { super(pais) }
	
	
	/** Agrega un nuevo lugar interesantes al pais que estoy editando. */	
	 def agregarLugarInteresante(){
	  	this.paisUM.agregarLugarInteresante(addLugar)
	  	this.lugaresPosibles.remove(addLugar)
	  	ObservableUtils.firePropertyChanged(this, "lugaresPosibles", lugaresPosibles)
	  }
	/** Quita un lugar de la lista de lugares interesantes del pais en cuestion.  */
	  def quitarLugarInteresante(){
	  	this.paisUM.quitarLugarInteresante(delLugar)
	  	this.lugaresPosibles.add(delLugar)
	  	ObservableUtils.firePropertyChanged(this, "lugaresPosibles", lugaresPosibles)
	  }
	  
}

@Observable	
class EdicionCaracteristicaAppModel extends EdicionAppModel {
	
	@Property var String nuevaCaracteristica 
	@Property var String caracteristicaDel
	
	new(Pais pais) {
		super(pais)
	}
	
	/**Agrega una nueva caracteristica al pais en cuestion. */
	def  agregarCaracteristica(){ 	
	  	this.paisUM.agregarCaracteristica(nuevaCaracteristica)
	  	ObservableUtils.firePropertyChanged(this, "paisUM", paisUM)
	}
	  /** Quita una nueva caracteristica del pais en cuestion. */
	 def quitarCaracteristica(){
	  	this.paisUM.quitarCaracteristica(caracteristicaDel)
	  	ObservableUtils.firePropertyChanged(this, "paisUM", paisUM)
	  }
	
}

@Observable
class EdicionConexionesAppModel extends EdicionAppModel {
	
	@Property val List<Pais> conexionesPosibles 
	@Property var Pais conexionSeleccionada
	@Property var Pais conexionDel
	@Property var Pais conexionAdd
	
	new(Pais pais, List<Pais> paisesParaConexiones) {
		super(pais)
		this._conexionesPosibles = paisesParaConexiones
		this.conexionesPosibles.remove(this)
		ObservableUtils.firePropertyChanged(this, "conexionesPosibles", conexionesPosibles)
	}
	
	/** Agrega una nueva conexion aerea al pais. */
	def agregarConexionAerea(){
		this.paisUM.agregarConexionAerea(conexionAdd)
		this.conexionesPosibles.remove(conexionAdd)
		ObservableUtils.firePropertyChanged(this, "conexionesPosibles", conexionesPosibles)
	}
	
	/** Quita una nueva conexion aerea del pais */
	def quitarConexionAerea(){
		this.paisUM.quitarConexionAerea(conexionDel)
		this.conexionesPosibles.add(conexionDel)
		ObservableUtils.firePropertyChanged(this, "conexionesPosibles", conexionesPosibles)
	}

}